# -*- coding: utf-8 -*-
# @File  : locust压测.py
# @Author: zbh
# @Date  : 2025/2/20_9:46

'''Locust 是一个用 Python 编写的开源负载测试工具，
它允许你以用户行为为驱动来对网站或其他系统进行可扩展的负载测试。
基本概念：
1、用户模拟：locust以用户为单位模拟对系统饿访问，每个用户可以执行一系列的任务，如登录、浏览页面、搜索等。
2、任务集：任务集是一组相关的任务，每个用户从任务集中选择一个任务执行。
3、任务：每个任务集包含一系列的任务，每个任务表示一个用户的行为，如点击按钮、输入文本等。
4、事件：每个任务可以触发一系列的事件，如请求开始、请求结束、响应时间等。
5、并发用户数：Locust 可以模拟多个用户同时访问系统，并发用户数可以通过命令行参数或配置文件指定。
6、响应时间：Locust 可以记录每个请求的响应时间，用于分析系统的性能。
7、错误率：Locust 可以记录每个请求的错误率，用于分析系统的稳定性。
8、报告：Locust 可以生成报告，用于分析系统的性能
9、断言：Locust 可以对响应进行断言，用于验证系统的正确性。
10、孵化率：指每秒启动的新用户数量，控制用户增长的速度；

'''

#locust -f locust_test.py --html=report.html --headless -u 10 -r 10 -t 1m --host=http://192.168.99.99


import locust
import time
from locust import task,between,HttpUser
import os
from locust_plugins.listeners import RescheduleTaskOnFail



url = "http://192.168.99.99/acp-custody/rest/login/extend/userForLogin?token=null"
payload = 'loginName=ab&password=HEX-04eea7fe393feb4ef5b3b75468ace6f618c067488e9f90dcaba2da754f5e4493f014789a457b27649c0e39eff5788a312c308db9b94a0d725acad5bc0c14dbf2dbd1e6c9b8300cbe1a3d390666eadc92d6762a8a40e3ec0d9f06577e5379e4058f3f5e1be38a1c2c640989796b61&validType=0&privateKey=ACF40088C2EE020AAFBC396C8131AC6311F57C9608BF1800E9657AF1B6F9C646'
headers = {
  'Content-Type': 'application/x-www-form-urlencoded',
  'Cookie': 'JSESSIONID=0000dHiCmreU0dKYE_Iza1LC-Yb:-1; acp_cookie_name=6E586A70529D27BE63459AB5F76E676234F943CAD98BB64870604F0D'
}

class QuickstartUser(HttpUser):  # 继承HttpUser类,表示模拟用户
    wait_time = between(1, 5)  # 属性设置用户执行任务之间的等待时间，用户执行任务之间的等待时间在1到5秒之间随机取值

    @task   # 装饰器用于定义任务，声明一个任务，每个用户执行该任务的概率相同
    def index_page(self):
        # self.client.get("http://192.168.99.99/acp-custody/login.html")  # 访问根路径   相当于requests.get()
        response=self.client.post(url, data=payload,headers=headers)  # 访问登录路径   相当于requests.post()
        print(f"登录请求状态码：{response.status_code}")
        print("接口响应时间：",response.elapsed.total_seconds())

    # @task(3)  # 表示该任务的执行权重是3，相对index_page任务更有可能被执行；
    # def view_item(self):
    #     for item_id in range(10):
    #         self.client.get(f"/item?id={item_id}", name="/item")  # 访问商品路径,相当于requests.get()
    #         time.sleep(1)

# def run():
#     os.system("locust -f locust_test.py --web-host=192.168.99.99")
#
# if __name__ == '__main__':
#     run()





